package com.titaniume.java;

import org.junit.Test;

import java.util.*;

/**
 *@program: JavaSenior
 *@description:
 *
 * 泛型的使用
 *
 * 1.jdk5.0新增的特性
 * 2.在集合中使用泛型
 * 总结：
 *  ①：集合接口在或集合类在jdk5.0时都修改为带泛型的结构
 *  ②：在实例化集合类时，可以指明具体的泛型类型
 *  ③：指明完以后，在集合类或接口中凡是定义接口时，内部结构（比如：方法，构造器，属性）使用到泛型的位置，都指定为实例化时的泛型类型
 *   比如 ： add(E e)--------->实例化后： add(Integer e)
 *  ④：泛型的类型必须是一个类，不能是基本数据类型，需要用到基本数据类型的位置，拿包装类替换
 *  ⑤：如果实例化时，没有指明泛型的类型 默认类型为java.lang.Object类型
 *
 *  3.如何自定义泛型结构：泛型类，泛型接口，泛型方法 ： 见JenericTest1.java
 *
 *
 *
 *
 *
 *
 *
 *@author: renfei.huang
 *@create: 2021-10-13 17:24
 */
public class GenericTest {


    @Test
    public void test() {

        ArrayList list = new ArrayList();
        //需求 ：存放学生成绩
        list.add(89);
        list.add(85);
        list.add(69);
        list.add(55);
        //问题一： 类型不安全
        list.add("Tom");

        for (Object sore : list) {
            //问题二： 强转时，可能出现 ClassCastException
            Integer stuSore = (Integer) sore;
            System.out.println(stuSore);
        }
    }


    //在集合中使用泛型的情况ArrayList为例
    @Test
    public void test2() {

        ArrayList<Integer> list = new ArrayList<Integer>();
        //需求 ：存放学生成绩
        list.add(89);
        list.add(85);
        list.add(69);
        list.add(55);
        //编译时就会进行检查，保证数据的安全
//        list.add("Tom");


        //方式一：
        /*for (Integer sore : list) {
            //避免了强制转换
            int stuScore = sore;
            System.out.println(stuScore);
        }*/

        //方式二
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println("iterator.next() = " + iterator.next());
        }
    }


    //在集合中使用泛型的情况HashMap为例
    @Test
    public  void test3(){

//        HashMap<String, Integer> hashMap = new HashMap<String, Integer>();

        //jdk特性 类型推断 ，后面的泛型省略
        HashMap<String, Integer> hashMap = new HashMap<>();


        hashMap.put("A",234);
        hashMap.put("B",-99);
        hashMap.put("C",888);
//        hashMap.put(aa,888);

        //泛型的嵌套
        Set<Map.Entry<String, Integer>> set = hashMap.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            System.out.println(entry.getKey() + " -------->" + entry.getValue());
        }

    }


}
